﻿#define _CRT_SECURE_NO_WARNINGS
//scanf和printf介绍
//printf 
//基本用法
//是将参数文本输出到屏幕上，他的名字里面f 代表format（格式化），表示可以定制输出文本的格式
//
//占位符
//printf载输出文本中可以指定占位符，所谓占位符就是这个位置可以用其它值代入
//占位符第一个字符一律为%
//#include <stdio.h>
//int main()
//{
//	printf("%s says it is %d o'clock\n", "lisi", 10);
//
//		return 0;
//
//}
//
//
//printf()参数与占位符是一一对应关系，如果有n个占位符，printf（）的参数就应该有n + 1个。
//如果参数个数少于对应的占位符，printf（）可能会输出内存中的任意值
//9.1.3 占位符列举
//printf() 的占位符有许多种类，与 C 语言的数据类型相对应。下面按照字母顺序，列出常用的占位
//符，方便查找，具体含义在后面章节介绍。
//
//• % a ：十六进制浮点数，字母输出为小写。
//• % A ：十六进制浮点数，字母输出为大写。
//• % c ：字符。
//• % d ：十进制整数。// int
//• % e ：使用科学计数法的浮点数，指数部分的e 为小写。
//• % E ：使用科学计数法的浮点数，指数部分的E 为大写。
//• % i ：整数，基本等同于 % d 。
//• % f ：小数（包含float 类型和double 类型）。//float %f double - %lf
//• % g ：6个有效数字的浮点数。整数部分一旦超过6位，就会自动转为科学计数法，指数部分的e
//为小写。
//• % G ：等同于 % g ，唯一的区别是指数部分的E 为大写。
//• % hd ：十进制 short int 类型。
//• % ho ：八进制 short int 类型。
//• % hx ：十六进制 short int 类型。
//• % hu ：unsigned short int 类型。
//• % ld ：十进制 long int 类型。
//• % lo ：八进制 long int 类型。
//• % lx ：十六进制 long int 类型。
//• % lu ：unsigned long int 类型。
//• % lld ：十进制 long long int 类型。
//• % llo ：八进制 long long int 类型。
//• % llx ：十六进制 long long int 类型。
//• % llu ：unsigned long long int 类型。
//• % Le ：科学计数法表示的 long double 类型浮点数。
//• % Lf ：long double 类型浮点数
//• % n ：已输出的字符串数量。该占位符本身不输出，只将值存储在指定变量之中。
//• % o ：八进制整数。
//• % p ：指针（用来打印地址）。
//• % s ：字符串。
//• % u ：无符号整数（unsigned int）。
//• % x ：十六进制整数。
//• % zd ： size_t 类型。
//• % %：输出一个百分号。


//限定宽度
//printf() 允许限定占位符的最小宽度。
//#include <stdio.h>
//int main()
//{
//	printf("%5d\n", 123); // 输出为 " 123"
//	return 0;
//}
//上面示例中， % 5d 表示这个占位符的宽度至少为5位。如果不满5位，对应的值的前面会添加空格。
//输出的值默认是右对齐，即输出内容前面会有空格；如果希望改成左对齐，在输出内容后面添加空
//格，可以在占位符的 % 的后面插入一个 - 号。
//#include <stdio.h>
//int main()
//{
//	printf("%-5d\n", 123); // 输出为 "123 "
//	return 0;
//}
//上面示例中，输出内容123 的后面添加了空格。
//对于小数，这个限定符会限制所有数字的最小显示宽度。
//// 输出 " 123.450000"
//#include <stdio.h>
//int main()
//{
//	printf("%12f\n", 123.45);
//	return 0;
//}
//上面示例中， % 12f 表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位，
//所以123.45 输出结果的头部会添加2个空格。
//
//
//总是显示正负号
//
//默认情况下， printf() 不对正数显示 + 号，只对负数显示 - 号。如果想让正数也输出 + 号，可
//以在占位符的 % 后面加一个 + 。
//
//
//
//限定小数位数
//输出小数时，有时希望限定小数的位数。举例来说，希望小数点后面只保留两位，占位符可以写
//成 % .2f 。
#include <stdio.h>
//int main()
//{
//	printf("%.2f\n", 123.45);
//	printf("%.1f\n", 123.45);
//	printf("%10.2f\n", 123.45);
//	最小宽度和小数位数这两个限定值，都可以用* 代替，通过printf() 的参数传入。
//	printf("%*>*f\n",10,2, 123.45);
//
//
//	return 0;
//}
//%f %lf 默认打印后六位


//输出部分字符串
//% s 占位符用来输出字符串，默认是全部输出。如果只想输出开头的部分，可以用% .[m]s 指定输出
//的长度，其中[m] 代表一个数字，表示所要输出的长度。
//int main()
//{
//			printf("%.3s\n","123435");
//	
//	return 0;
//
//}



//scanf
//当我们有了变量，我们需要给变量输入值就可以使用 scanf 函数，如果需要将变量的值输出在屏幕上
//的时候可以使用 prinf 函数

//int main()
//{
//	int score = 0;
//	printf("请输入成绩");
//	scanf("%d\n", &score);
//	printf("成绩是，%d",score);
//	return 0;
//	//scanf函数中占符位的后面的参数需要的是地址
//	//&取地址操作符，&scanf 取出score的地址
//
//}

//基本用法
//scanf() 函数用于读取用户的键盘输入。
//程序运行到这个语句时，会停下来，等待用户从键盘输入。
//用户输入数据、按下回车键后， scanf() 就会处理用户的输入，将其存入变量。
//它的原型定义在头文件stdio.h 。
//scanf() 的语法跟printf() 类似。

//int main()
//{
//	int a = 0;
//	int b = 0;
//	float c = 0.0;
//	float d = 0.0;
//	scanf("%d %d %f %f", &a, &b, &c, &d);
//	
//	printf("%d,%d,%f,%f", a, b, c, d);
//	return 0;
//
//}
//浮点数在内存中有可能无法精确保存


//scanf的返回值

//scanf() 的返回值是一个整数，表示成功读取的变量个数。
//如果没有读取任何项，或者匹配失败，则返回0 。
//如果在成功读取任何数据之前，发生了读取错误或者遇到读取到文件结尾，则返回常量 EOF(-1)。
//EOF - end of file 文件结束标志
#include <stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	float f = 0.0f;
//	int r = scanf("%d %d %f", &a, &b, &f);
//	printf("a=%d b=%d f=%f\n", a, b, f);
//	printf("r = %d\n", r);
//	return 0;
//}

//输入输出测试：
//如果输入2个数后，按ctrl + z ，提前结束输入：



//占位符
//scanf() 常用的占位符如下，与printf() 的占位符基本一致。
//•% c ：字符。
//•% d ：整数。
//•% f ： float 类型浮点数。
//•% lf ： double 类型浮点数。
//•% Lf ： long double 类型浮点数。
//•% s ：字符串。
//•% [] ：在方括号中指定一组匹配的字符（比如% [0 - 9] ），遇到不在集合之中的字符，匹配将会
//停止。
//
//
//上面所有占位符之中，除了% c 以外，都会自动忽略起首的空白字符。% c 不忽略空白字符，总是返
//回当前第一个字符，无论该字符是否为空格。
//
//如果要强制跳过字符前的空白字符，可以写成scanf(" %c", &ch) ，即% c 前加上一个空格，表
//示跳过零个或多个空白字符。
//
//int main()
//{
//	char arr[20] = { 0 };
//	int r = scanf( "%s", arr );
//	printf("%d", r);
//	printf("%s\n",arr );
//
//	return 0;
//
//}

//下面要特别说一下占位符% s ，它其实不能简单地等同于字符串。它的规则是，从当前第一个非空白
//字符开始读起，直到遇到空白字符（即空格、换行符、制表符等）为止。
//因为% s 不会包含空白字符，所以无法用来读取多个单词，除非多个% s 一起使用。这也意味着，
//scanf() 不适合读取可能包含空格的字符串，比如书名或歌曲名。另外， scanf() 遇到% s 占位
//符，会在字符串变量末尾存储一个空字符\0 。
//
//
//scanf() 将字符串读入字符数组时，不会检测字符串是否超过了数组长度。所以，储存字符串时，
//很可能会超过数组的边界，导致预想不到的结果。为了防止这种情况，使用% s 占位符时，应该指定
//读入字符串的最长长度，即写成% [m]s ，其中的[m] 是一个整数，表示读取字符串的最大长度，后
//面的字符将被丢


//赋值忽略符
//有时，用户的输入可能不符合预定的格式。
//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//	scanf("%d-%d-%d", &year, &month, &day);
//	printf("%d %d %d\n", year, month, day);
//	return 0;
//}
//上面示例中，如果用户输入 2020 - 01 - 01 ，就会正确解读出年、月、日。问题是用户可能输入其他
//格式，比如2020 / 01 / 01 ，这种情况下， scanf() 解析数据就会失败。
//为了避免这种情况， scanf() 提供了一个赋值忽略符（assignment suppression character） * 。
//只要把 * 加在任何占位符的百分号后面，该占位符就不会返回值，解析后将被丢弃。
//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//	scanf("%d%*c%d%*c%d", &year, &month, &day);
//	return 0;
//}
//%* c 就是在占位符的百分号后面，加入了赋值忽略符* ，表示这个占位符没有对应的
//变量，解读后不必返回。


//在创建变量的时候，给变量初始化是编程的好习惯，如果不给变量初始化，有的编译器会报错。

//局部变量不初始化的时候，它的值是随机的
//全局变量不初始化的时候，它的值是零